热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

出处|博客地址_javaScript原型和原型链

篇首语:本文由编程笔记#小编为大家整理,主要介绍了javaScript原型和原型链相关的知识,希望对你有一定的参考价值。前言

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Javascript原型和原型链相关的知识,希望对你有一定的参考价值。



前言

在了解原型和原型链之前,我们先了解一部分概念,constructor,prototype,proto


constructor

在之前判断数据类型的文章: Javascript常见数据类型检查校验

有提到过关于构造函数的属性constructor

constructor 的是返回创建实例对象的 构造函数的引用,这个属性的值是对函数本身的引用,而不是一个包含函数名称的字符串
具体用法:构造函数.prototype.constructor()

function constructorFn()
this.name = "11";
console.log(constructorFn.constructor); // Function
let a = new constructorFn();
console.log(a.constructor);
// ƒ constructorFn()
this.name = "11";

原型prototype


console.log(Object.prototype);
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
constructor: ƒ Object()
hasOwnProperty: ƒ hasOwnProperty()
isPrototypeOf: ƒ isPrototypeOf()
propertyIsEnumerable: ƒ propertyIsEnumerable()
toLocaleString: ƒ toLocaleString()
toString: ƒ toString()
valueOf: ƒ valueOf()
__defineGetter__: ƒ __defineGetter__()
__defineSetter__: ƒ __defineSetter__()
__lookupGetter__: ƒ __lookupGetter__()
__lookupSetter__: ƒ __lookupSetter__()
__proto__: (...)
get __proto__: ƒ __proto__()
set __proto__: ƒ __proto__()

在js当中,每个函数或者方法都有一个特殊的,并且是默认的属性叫作原型(prototype),它是一个对象,这个对象包含了这个方法自带的一些属性和方法。


原型链 proto

function constructorFun()
constructorFun.prototype.testName = "constructorFun";
let newFun = new constructorFun();
// newFun
console.log(newFun);
console.log(newFun.testName); // 通过__proto__查找 输出: constructorFun
console.log(newFun.constructor); // ƒ constructorFun()
console.log(newFun.__proto__); // testName: constructorFun, constructor: ƒ
console.log(newFun.prototype); // undefined
console.log(newFun.prototype.__proto__); // Error in created hook: "TypeError: Cannot read property __proto__ of undefined"

通过上述代码我们可以看到,prototype这个对象里面,包含了一个proto的属性,这个属性就是原型链的关键,



  • 当newFun用过new操作符,继承构造函数constructorFun的时候,testName,同时通过newFun.proto我们可以知道,newFun没有自己的name的时候,会通过proto不断地往上查找,直到查找到相关属性,如果不存在则为undefined



  • Javascript 中只有一种结构:对象。每个实例对象(object)都有一个私有属性(称之为 proto )指向它的构造函数的原型对象(prototype)。该原型对象也有一个自己的原型对象(proto),层层向上直到一个对象的原型对象为 null。根据定义,null 没有原型,并作为这个原型链中的最后一个环节。(断言出自 MDN https://developer.mozilla.org/


从原型链查找到null的过程


构造函数

function constructorFun()
constructorFun.prototype.testName = "constructorFun";
let newFun = new constructorFun();
// newFun
console.log(newFun);
console.log(newFun.testName); // 通过__proto__查找 输出: constructorFun
console.log(newFun.constructor); // ƒ constructorFun()
console.log(newFun.__proto__); // testName: constructorFun, constructor: ƒ
console.log(newFun.prototype); // undefined
console.log(newFun.prototype.__proto__); // Error in created hook: "TypeError: Cannot read property __proto__ of undefined"


  • 使用new操作符实例化的方法,没有自己的原型对象,并且通过proto可以向上查找构造函数的属性和方法,以及构造函数。

  • 实例化方法可以通过constructor属性,获取构造函数本身

// constructorFun
console.log(constructorFun.constructor); // ƒ Function() [native code]
console.log(constructorFun.__proto__ === Function.prototype); // true
console.log(constructorFun.prototype); // testName: constructorFun, constructor: ƒtestName: "constructorFun"constructor: ƒ constructorFun()[[Prototype]] ...
console.log(constructorFun.prototype.constructor); // ƒ constructorFun()
console.log(constructorFun.prototype.__proto__ === Object.prototype); // true


  • 构造函数constructorFun的属性constructor为Function,原型链向上查找的时候,构造函数的proto → Function的原型prtotype

  • constructorFun的原型对象的proto是对象的原型

// Function
console.log(Function.constructor); // ƒ Function() [native code]
console.log(Function.__proto__); // ƒ () [native code]
console.log(Function.prototype); // ƒ () [native code]
console.log(Function.prototype.constructor); // ƒ Function() [native code]
console.log(Function.prototype.__proto__ === Object.prototype); // true

// Object
console.log(Object.constructor); // ƒ Function() [native code]
console.log(Object.__proto__); // ƒ () [native code]
console.log(Object.prototype); // constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, …
console.log(Object.prototype.constructor); // ƒ Object() [native code]
console.log(Object.prototype.__proto__); // null

字面量创建对象

let parent = name:1
// parent
console.log(parent.constructor); // ƒ Object() [native code]
console.log(parent.__proto__); // constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, …
console.log(parent.prototype); // undefined
// console.log(parent.prototype.__proto__); // Error in created hook: "TypeError: Cannot read property __proto__ of undefined"
// Object
console.log(Object.constructor); // ƒ Function() [native code]
console.log(Object.__proto__); // ƒ () [native code]
console.log(Object.prototype); // constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, …
console.log(Object.prototype.constructor); // ƒ Object() [native code]
console.log(Object.prototype.__proto__); // null

通过以上代码查找,我们可以画出对应的关系图

总结:



  • 原型prototype和原型链查找proto,constructor构成了原型链,通过这些属性和方法可以层层网上查找一直到null

  • 构造函数实例化方法,可以通过原型链的形式向上查找到对应属性(这个属性存在的前提下),这里的知识点还包含了new实例的过程中,继承方面的知识

  • 使用原型链和原型,我们可以进行封装一下构造方法,还有一些插件,我们在阅读一下框架源码或者插件源码的时候,都能看到原型和构造函数相关的代码。

  • 原型和原型链的知识从概念上并不太好理解或者说有点晦涩难懂,可以试着去写一些实例化对象和方法,去查找原型上的方法

  • 并且在开发过程中如果涉及到面向对象编程或者运用较多的话,可以加深我们的理解

  • 类似数组以及Function等构造函数,我们可以通过继承,在原型链上扩展一些通用的utils方法

以上就是js中原型和原型链概念的简单解析,有任何问题欢迎留言,后续的文章整理然后作为补充。

文章博客地址:Javascript原型和原型链


源码地址


欢迎关注公众号:程序员布欧,不定期更新一些文章

创作不易,转载请注明出处和作者。


推荐阅读
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • 本文介绍了自学Vue的第01天的内容,包括学习目标、学习资料的收集和学习方法的选择。作者解释了为什么要学习Vue以及选择Vue的原因,包括完善的中文文档、较低的学习曲线、使用人数众多等。作者还列举了自己选择的学习资料,包括全新vue2.5核心技术全方位讲解+实战精讲教程、全新vue2.5项目实战全家桶单页面仿京东电商等。最后,作者提出了学习方法,包括简单的入门课程和实战课程。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • JavaScript设计模式之策略模式(Strategy Pattern)的优势及应用
    本文介绍了JavaScript设计模式之策略模式(Strategy Pattern)的定义和优势,策略模式可以避免代码中的多重判断条件,体现了开放-封闭原则。同时,策略模式的应用可以使系统的算法重复利用,避免复制粘贴。然而,策略模式也会增加策略类的数量,违反最少知识原则,需要了解各种策略类才能更好地应用于业务中。本文还以员工年终奖的计算为例,说明了策略模式的应用场景和实现方式。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • 用Vue实现的Demo商品管理效果图及实现代码
    本文介绍了一个使用Vue实现的Demo商品管理的效果图及实现代码。 ... [详细]
author-avatar
UNESCO媒介与女性教席走_890
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有